'''
Created on 18/11/2011

@author: Byron
'''

from Ficha import Ficha
from Constants import *

class GameManager():

    
    def __init__(self, pTeam):
        self._Tablero = []
        self._Team = pTeam
        self._MisFichas = []
        self._Turno = False
        self._FichaSelect = None
        
    
    def crearTablero(self):
        cntRow = 0;
        while(cntRow < CNT_CASILLAS):  
            row = [];
            cntCol = 0;
            while(cntCol < CNT_CASILLAS):
                # agregar fichas a las casillas negras a las
                # primeras y ultimas tres filas
                if( cntRow < ROW_BLACK  ):  
                    if( (cntRow+cntCol)%2 == 0 ):
                        ficha = Ficha(TEAM_BLACK, FICHA, cntCol, cntRow);
                        if(TEAM_BLACK == self._Team):
                            self._MisFichas.append(ficha)
                    else:
                        ficha = None
                elif( cntRow > ROW_WHITE ):  
                    if( (cntRow+cntCol)%2 == 0 ):
                        ficha = Ficha(TEAM_WHITE, FICHA, cntCol, cntRow);
                        if( TEAM_WHITE == self._Team):
                            self._MisFichas.append(ficha)
                    else:
                        ficha = None
                # todas las casillas vacias
                else:
                    ficha = None;
                row.append(ficha);
                cntCol = cntCol + 1;
            self._Tablero.append(row);
            cntRow = cntRow + 1;
 
    
    def buscarCasillasCanEat(self):
        listCasillas = []
        cntFichas = 0
        while( cntFichas < len(self._MisFichas) ):
            ficha = self._MisFichas[cntFichas]
            if((self._Team == TEAM_BLACK and ficha.getPosY() < CNT_CASILLAS-2) or
               (self._Team == TEAM_WHITE and ficha.getPosY() > 1) ):
                # comer a la izquierda
                if(ficha.getPosX() > 1 and self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+IZQ] != None and
                   (self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+IZQ]).getTeam() != self._Team and 
                   self._Tablero[ficha.getPosY()+self._Team*2][ficha.getPosX()+IZQ*2] == None  ):
                    comida  = self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+IZQ]
                    destino = [ficha.getPosX()+IZQ*2, ficha.getPosY()+self._Team*2]
                    print("la ficha "+str(ficha.getPos())+" tiene comida en "+str(comida.getPos())+" quedando en la casilla"+str(destino))
                    listCasillas.append([ficha, destino, comida])
                # comer a la derecha 
                if(ficha.getPosX() < CNT_CASILLAS-2 and self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+DER] != None and
                   (self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+DER]).getTeam() != self._Team  and 
                   self._Tablero[ficha.getPosY()+self._Team*2][ficha.getPosX()+DER*2] == None):
                    comida  = self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+DER]
                    destino = [ficha.getPosX()+DER*2, ficha.getPosY()+self._Team*2]
                    print("la ficha "+str(ficha.getPos())+" tiene comida en "+str(comida.getPos())+" quedando en la casilla"+str(destino))
                    listCasillas.append([ficha, destino, comida])
            cntFichas = cntFichas+1
        return listCasillas
            
    def canEat(self):
        ficha = self._FichaSelect
        # comer a la izquierda
        if(ficha.getPosX() > 1 and self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+IZQ] != None and
           (self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+IZQ]).getTeam() != self._Team  and 
           self._Tablero[ficha.getPosY()+self._Team*2][ficha.getPosX()+IZQ*2] == None):
            return True
        # comer a la derecha 
        elif(ficha.getPosX() > 1 and self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+DER] != None and
           (self._Tablero[ficha.getPosY()+self._Team][ficha.getPosX()+DER]).getTeam() != self._Team  and 
           self._Tablero[ficha.getPosY()+self._Team*2][ficha.getPosX()+DER*2] == None):
            return True
        else:
            return False
        
    def fichaComida(self, pPosDestino, pListHambrientas):
        cntFichas = 0
        while( cntFichas < len(pListHambrientas) ):
            if( pListHambrientas[cntFichas][0] == self._FichaSelect and pListHambrientas[cntFichas][1] == pPosDestino):
                print("Ficha comida: "+str((pListHambrientas[cntFichas][0]).getPos()) )
                return pListHambrientas[cntFichas][2]
            cntFichas = cntFichas+1
        return None
    
    def movimientoPosible(self, pPosFin):
        if( (self._Tablero[pPosFin[POS_Y]][pPosFin[POS_X]] == None) and
            (pPosFin[POS_Y] == self._FichaSelect.getPosY()+self._Team) and
            (pPosFin[POS_X] == self._FichaSelect.getPosX()+1 or pPosFin[POS_X] == self._FichaSelect.getPosX()-1 ) ):
            return True
        else:
            return False     
           
    def esCorona(self):
        if( self._Team == TEAM_BLACK and self._FichaSelect.getPosY() == CNT_CASILLAS):
            self._FichaSelect.setType( CORONA )
            return True
        elif ( self._Team == TEAM_WHITE and self._FichaSelect.getPosY() == 0):
            self._FichaSelect.setType( CORONA )
            return True
        else:
            return False
    
    def miTurno(self):
        if( len(self._MisFichas) == 0):
            # TODO: Socket perdi
            print("Perdio \nFin de partida")
        self._Turno = True
        
    
    def moverFicha(self, pPosFin):
        hambrientas = self.buscarCasillasCanEat()
        comida = self.fichaComida(pPosFin, hambrientas)
        # ninguna ficha puede comer
        if( len(hambrientas) == 0):
            print("nadie come")
            # puede mover la ficha al lugar de destino
            if( self.movimientoPosible(pPosFin) ):
                # mover ficha
                posAnterior = self._FichaSelect.getPos()
                self._Tablero[self._FichaSelect.getPosY()][self._FichaSelect.getPosX()] = None
                self._Tablero[pPosFin[POS_Y]][pPosFin[POS_X]] = self._FichaSelect
                self._FichaSelect.setPos(pPosFin)
                # determinar si se convirtio en corona
                corona = self.esCorona()
                self._FichaSelect = None
                self._Turno = False
                self._Mensajero.send(GAME+DIVISOR+PASS)
                # Socket mover ficha y esCorona
                print("Movio ficha de "+str(posAnterior)+" a "+str(pPosFin))
                self._Log.addInfo("Me","Movio ficha de "+str(posAnterior)+" a "+str(pPosFin))
                self._Mensajero.send(GAME+DIVISOR+ACTUALIZAR+DIVISOR+str(posAnterior)+DIVISOR+str(pPosFin)+DIVISOR+'[]')
                if( corona ):
                    print("Ficha coronada")
                return True
            else:
                self._FichaSelect = None
                print("movimiento invalido")
                return False
        # existen fichas que pueden comer y la seleccionada es una de ellas
        elif ( comida != None ):
            # mover ficha
            posAnterior = self._FichaSelect.getPos()
            self._Tablero[self._FichaSelect.getPosY()][self._FichaSelect.getPosX()] = None
            self._Tablero[pPosFin[POS_Y]][pPosFin[POS_X]] = self._FichaSelect
            self._FichaSelect.setPos(pPosFin)
            # eliminar ficha comida
            self._Tablero[comida.getPosY()][comida.getPosX()] = None
            # determinar si se convirtio en corona
            corona = self.esCorona() 
            # TODO: Socket mover y comida y esCorona
            print("Movio ficha de "+str(posAnterior)+" a "+str(pPosFin))
            print("Comio ficha en "+str(comida.getPos()))
            self._Log.addInfo("Me","Movio ficha de "+str(posAnterior)+" a "+str(pPosFin))
            self._Log.addInfo("Me","Comio ficha en "+str(comida.getPos()))
            self._Mensajero.send(GAME+DIVISOR+ACTUALIZAR+DIVISOR+str(posAnterior)+DIVISOR+str(pPosFin)+DIVISOR+str(comida.getPos()))
            if( corona ):
                print("Ficha coronada")
                   
            if( not self.canEat() ):
                self._FichaSelect = None
                self._Turno = False
                self._Mensajero.send(GAME+DIVISOR+PASS)
            else:
                print("seguir comiendo")
            return True
        # existen fichas que pueden comer y la seleccionada no es una de ellas
        else:
            print("movimiento invalido")
            self._FichaSelect = None
            return False
            
    def actualizarTablero(self, pPosX, pPosY):
        if( self._Turno ):
            if(self._FichaSelect == None and self._Tablero[pPosY][pPosX] != None):
                self._FichaSelect = self._Tablero[pPosY][pPosX]
                print("Select ficha"+ str([pPosX, pPosY]))
                return False
            elif(self._FichaSelect):
                return self.moverFicha([pPosX, pPosY])
        else:
            return False
        
    def actualizacionPorSocket(self, pPosAnt, pActual, pComida):
        # actualizar movimiento
        ficha = self._Tablero[pPosAnt[POS_Y]][pPosAnt[POS_X]]
        self._Tablero[pPosAnt[POS_Y]][pPosAnt[POS_X]] = None
        self._Tablero[pActual[POS_Y]][pActual[POS_X]] = ficha
        # si se corono
        if( self._Team != TEAM_BLACK and ficha.getPosY() == CNT_CASILLAS-1):
            ficha.setType( CORONA )
        elif ( self._Team != TEAM_WHITE and ficha.getPosY() == 0):
            ficha.setType( CORONA )
        ficha.setPos(pActual)
        # si comio ficha
        if(pComida):
            self._MisFichas.remove(self._Tablero[pComida[POS_Y]][pComida[POS_X]]) #
            self._Tablero[pComida[POS_Y]][pComida[POS_X]] = None
            
            
        
    '''  Gets  '''  
        
    def getTablero(self):
        return self._Tablero
    
    def getTeam(self):
        return self._Team
    
    def getMisFichas(self):
        return self._MisFichas
    
    def getTurno(self):
        return self._Turno

    
    '''  Sets  '''  

    def setTeam(self, pTeam):
        self._Type = pTeam
    
    def setMisFichas(self, pMisFichas):
        self._MisFichas = pMisFichas;
    
    def setTurno(self, pTurno):
        self._Turno = pTurno
        
    def setMensajero(self,message):
        self._Mensajero = message
        
    def setVisor(self,Visor):
        self._Visor = Visor
    
    def setLog(self,Log):
        self._Log = Log
        
    def ejecutar(self,message):
        splitMessage = message.split(DIVISOR)
        print(splitMessage)
        if splitMessage[1] == PASS:
            self.miTurno()
        elif splitMessage[1] == ACTUALIZAR:
            self.actualizacionPorSocket(eval(splitMessage[2]), eval(splitMessage[3]), eval(splitMessage[4]))
            self._Visor.colorearTablero(self._Tablero)
            self._Log.addInfo("Friend","Movio ficha de "+splitMessage[2]+" a "+splitMessage[3])
            if eval(splitMessage[4]) != []:
                self._Log.addInfo("Friend","Comio ficha en "+splitMessage[4])
        
        